﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Data.SqlClient;

namespace GAIA_Logica
{
    public class Clientes
    {
        #region Atributos

        private string _codigo;

        public string Codigo
        {
            get { return _codigo; }
            set { _codigo = value; }
        }
        private String _nombre;

        public String Nombre
        {
            get { return _nombre; }
            set { _nombre = value; }
        }
        private String _ap1;

        public String Ap1
        {
            get { return _ap1; }
            set { _ap1 = value; }
        }
        private String _ap2;

        public String Ap2
        {
            get { return _ap2; }
            set { _ap2 = value; }
        }

        private String _id;

        public String Id
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _tipo;

        public string Tipo
        {
            get { return _tipo; }
            set { _tipo = value; }
        }

        private string _nombreRep;

        public string NombreRep
        {
            get { return _nombreRep; }
            set { _nombreRep = value; }
        }

        private string _ap1Rep;

        public string Ap1Rep
        {
            get { return _ap1Rep; }
            set { _ap1Rep = value; }
        }

        private string _ap2Rep;

        public string Ap2Rep
        {
            get { return _ap2Rep; }
            set { _ap2Rep = value; }
        }

        private string _cedRep;

        public string CedRep
        {
            get { return _cedRep; }
            set { _cedRep = value; }
        }

        //Conexion a base de datos
        private AcessoBD dba = new AcessoBD(Properties.Settings.Default.GAIA_CON);

        #endregion

        #region Metodos

        #region Constructores
            public Clientes(String pnombre,String pap1,String pap2,String pid) {
                Codigo = null;
                Nombre = pnombre;
                Ap1 = pap1;
                Ap2 = pap2;
                Id = pid;
                Tipo = "F";
            }

            public Clientes(String pcodigo, String pnombre, String pap1, String pap2, String pid)
            {
                Codigo = pcodigo;
                Nombre = pnombre;
                Ap1 = pap1;
                Ap2 = pap2;
                Id = pid;
                Tipo = "F";
            }

            //Constructor jurídico
            public Clientes(String pnombre_empresa, String pid_empresa, String pnombreRep, String pap1Rep, String pap2Rep, String pid)
            {
                Codigo = null;
                Nombre = pnombre_empresa;
                Id = pid_empresa;
                NombreRep = pnombreRep;
                Ap1Rep = pap1Rep;
                Ap2Rep = pap2Rep;
                CedRep = pid;
                Tipo = "J";
            }
            public Clientes(){}
        #endregion

        private void generarCodigo(){
            Codigo = this.Nombre.Substring(0, 1).ToUpper() + this.Ap1.Substring(0, 1).ToUpper() + this.Ap2.Substring(0, 1).ToUpper() + this.Id.Substring((this.Id.Length) - 3);
            
        }

        private void generarCodigoJuridico()
        {
            Codigo = this.Nombre.Substring(0, 3).ToUpper() + this.Id.Substring((this.Id.Length) - 3);

        }


        public bool ingresarCliente()
        {
            generarCodigo();
            bool result = false;

            try
            {
                //Query
                String sqlQuery = "Insert into Clientes (codigo, id, nombre, apellido1, apellido2, tipo) values(param1,param2,param3,param4,param5,param6)";

                //Lista parametros
                Parametros[] parametros = new Parametros[6];
                parametros[0] = new Parametros(this.Codigo, "param1");
                parametros[1] = new Parametros(this.Id, "param2");
                parametros[2] = new Parametros(this.Nombre, "param3");
                parametros[3] = new Parametros(this.Ap1, "param4");
                parametros[4] = new Parametros(this.Ap2, "param5");
                parametros[5] = new Parametros(this.Tipo, "param6");

                result = dba.executeSQL(sqlQuery, parametros);

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de ingresar el cliente: " + ex.Message);
            }

            return result;
        }

        public bool ingresarClienteJuridico()
        {
            generarCodigoJuridico();
            bool result = false;

            try
            {
                //Query
                String sqlQuery = "Insert into Clientes (codigo, id, nombre, apellido1_rep, apellido2_rep, ced_rep, tipo, nombre_rep ) values(param1,param2,param3,param4,param5,param6,param7,param8)";

                //Lista parametros
                Parametros[] parametros = new Parametros[8];
                parametros[0] = new Parametros(this.Codigo, "param1");
                parametros[1] = new Parametros(this.Id, "param2");
                parametros[2] = new Parametros(this.Nombre, "param3");
                parametros[3] = new Parametros(this.Ap1Rep, "param4");
                parametros[4] = new Parametros(this.Ap2Rep, "param5");
                parametros[5] = new Parametros(this.CedRep, "param6");
                parametros[6] = new Parametros(this.Tipo, "param7");
                parametros[7] = new Parametros(this.NombreRep, "param8");

                result = dba.executeSQL(sqlQuery, parametros);

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de ingresar el cliente: " + ex.Message);
            }

            return result;
        }

        public bool borrarCliente()
        {
            bool result = false;

            try
            {
                String sqlQuery = "Delete Clientes where codigo=" + this.Codigo;
                result = dba.executeSQL(sqlQuery, null);
            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de eliminar el cliente:" + ex.Message);
            }

            return result;
        }

        public bool actualizarCliente(string pcod)
        {

            bool result = false;

            try
            {

                //Query
                String sqlQuery;
                Parametros[] parametros;
                if (this.Tipo == "J")
                {
                    sqlQuery = "Update Clientes set codigo=param1,id=param2,nombre=param3,"+
                               "apellido1_rep=param4,apellido2_rep=param5,nombre_rep=param6,"+
                               "ced_rep=param7 where codigo='" + pcod + "'";
                    //Lista parametros
                    parametros = new Parametros[7];
                    parametros[0] = new Parametros(this.Codigo, "param1");
                    parametros[1] = new Parametros(this.Id, "param2");
                    parametros[2] = new Parametros(this.Nombre, "param3");
                    parametros[3] = new Parametros(this.Ap1Rep, "param4");
                    parametros[4] = new Parametros(this.Ap2Rep, "param5");
                    parametros[5] = new Parametros(this.NombreRep, "param6");
                    parametros[6] = new Parametros(this.CedRep, "param7");
                }
                else {
                    sqlQuery = "Update Clientes set codigo=param1,id=param2,nombre=param3,"+
                               "apellido1=param4,apellido2=param5 where codigo='" + pcod + "'";
                    //Lista parametros
                    parametros = new Parametros[5];
                    parametros[0] = new Parametros(this.Codigo, "param1");
                    parametros[1] = new Parametros(this.Id, "param2");
                    parametros[2] = new Parametros(this.Nombre, "param3");
                    parametros[3] = new Parametros(this.Ap1, "param4");
                    parametros[4] = new Parametros(this.Ap2, "param5");
                }

                

                result = dba.executeSQL(sqlQuery, parametros);
            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de actualizar el cliente:" + ex.Message);
            }

            return result;

        }

        

        //Listado de clientes
        public List<Clientes> getAllClientes()
        {

            List<Clientes> listaClientes = new List<Clientes>();

            try
            {

                //Query
                String sqlQuery = "select codigo, id,nombre,apellido1,apellido2 from Clientes";
                SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                if (rs != null)
                {

                    while (rs.Read())
                    {
                        Clientes objCliente = new Clientes(rs.GetString(rs.GetOrdinal("codigo")), rs.GetString(rs.GetOrdinal("nombre")), 
                            rs.GetString(rs.GetOrdinal("apellido1")), rs.GetString(rs.GetOrdinal("apellido2")), rs.GetString(rs.GetOrdinal("id")));
                        listaClientes.Add(objCliente);
                    }

                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de obtener los clientes:" + ex.Message);
            }

            return listaClientes;

        }


        //Obtiene el cliente por id
        public Clientes getCliente(String pid)
        {
            Clientes objCliente = null;

            try
            {

                //Query
                String sqlQuery = "select codigo, id,nombre,isnull(apellido1,'') as apellido1,isnull(apellido2,'') as apellido2  from Clientes where id='" + pid + "'";
                SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                if (rs != null)
                {

                    while (rs.Read())
                    {
                         objCliente = new Clientes(rs.GetString(rs.GetOrdinal("codigo")), rs.GetString(rs.GetOrdinal("nombre")),
                            rs.GetString(rs.GetOrdinal("apellido1")), rs.GetString(rs.GetOrdinal("apellido2")), rs.GetString(rs.GetOrdinal("id")));
                    }
                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de obtener el cliente:" + ex.Message);
            }

            return objCliente;

        }


        //Obtiene el cliente por codigo
        public Clientes getClienteXCodigo(String codigo)
        {
            Clientes objCliente = null;

            try
            {

                //Query
                String sqlQuery = "select codigo, id,nombre,isnull(apellido1,'') as apellido1,isnull(apellido2,'') as apellido2 from Clientes where codigo='" + codigo + "'";
                SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                if (rs != null)
                {

                    while (rs.Read())
                    {
                        objCliente = new Clientes(rs.GetString(rs.GetOrdinal("codigo")), rs.GetString(rs.GetOrdinal("nombre")),
                           rs.GetString(rs.GetOrdinal("apellido1")), rs.GetString(rs.GetOrdinal("apellido2")), rs.GetString(rs.GetOrdinal("id")));
                    }
                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de obtener el cliente:" + ex.Message);
            }

            return objCliente;

        }



        //busqueda Clientes por nombre y apellidos
        public List<Clientes> buscarClienteXNombre(string pnombre,string pap1,string ap2)
        {

            List<Clientes> listaClientes = new List<Clientes>();

            try
            {

                //Query
                String sqlQuery = "select codigo, id,nombre,isnull(apellido1,'') as apellido1,isnull(apellido2,'') as apellido2  from Clientes where nombre like ('%" + pnombre + "%') and apellido1 like ('%" + pap1 + "%') and apellido2 like ('%" + ap2 + "%') and tipo = 'F' ";
                SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                if (rs != null)
                {

                    while (rs.Read())
                    {
                        Clientes objCliente = new Clientes(rs.GetString(rs.GetOrdinal("codigo")), rs.GetString(rs.GetOrdinal("nombre")),
                            rs.GetString(rs.GetOrdinal("apellido1")), rs.GetString(rs.GetOrdinal("apellido2")), rs.GetString(rs.GetOrdinal("id")));
                        listaClientes.Add(objCliente);
                    }

                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de obtener los clientes:" + ex.Message);
            }

            return listaClientes;

        }

        //busqueda de clientes por nombre
        public List<Clientes> buscarClienteXNombre(string pnombre)
        {

            List<Clientes> listaClientes = new List<Clientes>();

            try
            {

                //Query
                String sqlQuery = "select codigo, id,nombre,isnull(apellido1,'') as apellido1,isnull(apellido2,'') as apellido2 from Clientes where nombre like ('%" + pnombre + "%')";
                SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                if (rs != null)
                {

                    while (rs.Read())
                    {
                        Clientes objCliente = new Clientes(rs.GetString(rs.GetOrdinal("codigo")), rs.GetString(rs.GetOrdinal("nombre")),
                            rs.GetString(rs.GetOrdinal("apellido1")), rs.GetString(rs.GetOrdinal("apellido2")), rs.GetString(rs.GetOrdinal("id")));
                        listaClientes.Add(objCliente);
                    }

                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de obtener los clientes:" + ex.Message);
            }

            return listaClientes;

        }

        //busqueda de clientes por nombre según el tipo de cliente (F o J)
        public List<Clientes> buscarClienteXNombre(string pnombre, string pTipo)
        {

            List<Clientes> listaClientes = new List<Clientes>();

            try
            {

                //Query
                String sqlQuery;
                if (pTipo == "J")
                {
                    sqlQuery = "select codigo, id, nombre, tipo, nombre_rep, apellido1_rep, apellido2_rep, ced_rep from Clientes where nombre like ('%" + pnombre + "%') and tipo ='" + pTipo + "'";
                }
                else {
                    sqlQuery = "select codigo, id,nombre,apellido1,apellido2,tipo from Clientes where nombre like ('%" + pnombre + "%') and tipo ='" + pTipo + "'";
                }
                
                SqlDataReader rs = dba.execute_Consulta(sqlQuery, null);

                if (rs != null)
                {

                    while (rs.Read())
                    {
                        Clientes objCliente;
                        if (pTipo == "J")
                        {
                            objCliente = new Clientes(rs.GetString(rs.GetOrdinal("nombre")),
                                                      rs.GetString(rs.GetOrdinal("id")),
                                                      rs.GetString(rs.GetOrdinal("nombre_rep")),
                                                      rs.GetString(rs.GetOrdinal("apellido1_rep")),
                                                      rs.GetString(rs.GetOrdinal("apellido2_rep")),
                                                      rs.GetString(rs.GetOrdinal("ced_rep")));
                            objCliente.Codigo = rs.GetString(rs.GetOrdinal("codigo"));
                            
                        }
                        else {
                            objCliente = new Clientes(rs.GetString(rs.GetOrdinal("codigo")),
                                                      rs.GetString(rs.GetOrdinal("nombre")),
                                                      rs.GetString(rs.GetOrdinal("apellido1")),
                                                      rs.GetString(rs.GetOrdinal("apellido2")),
                                                      rs.GetString(rs.GetOrdinal("id")));
                        }
                        listaClientes.Add(objCliente);
                    }

                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrio un error a la hora de obtener los clientes:" + ex.Message);
            }

            return listaClientes;

        }

        #endregion



    }
}
